package com.ceolt.biz.impl;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import com.ceolt.biz.IGameBiz;
import com.ceolt.dao.IBaseTermDao;
import com.ceolt.entity.Vocabulary;
import com.ceolt.entity.Word;
import com.ceolt.exception.NoHistoryException;
import com.ceolt.util.BeanFactory;
import com.ceolt.util.StringUtil;

/**************************************
 * 
 * @description　针对中英文互答环节的业务操作提供数据支撑 
 * @author yejf
 * @date 2013-7-4 上午9:44:13
 * @version jdk1.6
 *
 */
public class GameBizImpl implements IGameBiz {
	
	/** 依赖于 dao　接口*/
	private IBaseTermDao baseTermDao;
	
	//构造方法
	public GameBizImpl() {
		//通过工厂来初始化dao 属性
		this.baseTermDao = (IBaseTermDao) BeanFactory.getBean("baseTermDao");
	}
	
	/*
	 * 此方法是为获取所有还没有完成的 提示英文，回到中文 的数据 注： 数据来源有两个地方： 1. 从原始数据中获取所有的单词和词汇 2.
	 * 从之前保存过的历史文件中读取的数据 到底返回哪个数据，取决于参数 isNew 如果 isNew为真，则返回1 否则，返回2
	 * 
	 * @param isNew 此参数决定本方法的数据来源
	 * 
	 * @return
	 * 
	 * @see com.tz.cels.service.IGameService#en2cn(boolean)
	 */
	@Override
	public Map<String, String> en2cn(boolean isNew) throws NoHistoryException {
		// 1.创建一个 map来存放这些数据
		Map<String, String> en2cnMap = new HashMap<>();
		// 2.根据 参数 isNew来决定从哪个数据源获取这些数据
		if (isNew) {
			// 返回原始数据
			Set<Word> words = baseTermDao.getAllWords();
			for (Word w : words) {
				// 把所有的单词添加到map中
				en2cnMap.put(w.getEn(), StringUtil.toString(w.getCn()));
			}
			// 添加词汇
			Set<Vocabulary> vs = baseTermDao.getAllVocabularies();
			for (Vocabulary v : vs) {
				// 把所有词汇添加到map中
				en2cnMap.put(v.getEn(), StringUtil.toString(v.getCn()));
			}

		} else {
			// 返回从保存的历史记录中获取的数据
			File en2cnFile = new File(EN_TO_CN_FILE);
			// 判断此文件是否存在，如果不存在，直接抛出异常
			if (!en2cnFile.exists()) {
				throw new NoHistoryException("你还没有历史记录",EN_TO_CN_FILE);
			}
			// 说明这个文件是存在的
			en2cnMap = baseTermDao.readFromFile(en2cnFile.getAbsolutePath());
		}
		// 返回
		return en2cnMap;
	}

	/*
	 * 此方法是为获取所有还没有完成的 提示中文，回答英文 的数据 注： 数据来源有两个地方： 1. 从原始数据中获取所有的单词和词汇 2.
	 * 从之前保存过的历史文件中读取的数据 到底返回哪个数据，取决于参数 isNew 如果 isNew为真，则返回1 否则，返回2
	 * 
	 * @param isNew 此参数决定本方法的数据来源
	 * 
	 * @return
	 * 
	 * @see com.tz.cels.service.IGameService#cn2en(boolean)
	 */
	@Override
	public Map<String, String> cn2en(boolean isNew) 
							throws NoHistoryException {
		// 1.创建一个 map来存放这些数据
		Map<String, String> cn2enMap = new HashMap<>();
		// 2.根据 参数 isNew来决定从哪个数据源获取这些数据
		if (isNew) {
			// 返回原始数据
			Set<Word> words = baseTermDao.getAllWords();
			for (Word w : words) {
				// 把所有的单词添加到map中
				cn2enMap.put(StringUtil.toString(w.getCn()),w.getEn());
			}
			// 添加词汇
			Set<Vocabulary> vs = baseTermDao.getAllVocabularies();
			for (Vocabulary v : vs) {
				// 把所有词汇添加到map中
				cn2enMap.put(StringUtil.toString(v.getCn()),v.getEn());
			}

		} else {
			// 返回从保存的历史记录中获取的数据
			File cn2enFile = new File(CN_TO_EN_FILE);
			// 判断此文件是否存在，如果不存在，直接抛出异常
			if (!cn2enFile.exists()) {
				throw new NoHistoryException("你还没有历史记录",CN_TO_EN_FILE);
			}
			// 说明这个文件是存在的
			cn2enMap = baseTermDao.readFromFile(cn2enFile.getAbsolutePath());
		}
		// 返回
		return cn2enMap;
	}

	/*
	 * 持久化没有被用户所答的单词和词汇, 
	 * 第二个参数 en2cn为true，则把此数据持化久到 en2cn.his 文件
	 * 否则，持久化到 cn2en.his 文件
	 * @param map
	 * @param en2cn
	 * 
	 * @see com.tz.cels.service.IGameService#saveGameHistory(java.util.Map,
	 * boolean)
	 */
	@Override
	public void saveGameHistory(Map<String, String> map, boolean en2cn) {
		//先判断父目录是否存在
		File parent = new File(HISTORY_DIR);
		if(!parent.exists()){
			parent.mkdirs();  //以保证目录结构存在
		}
		File targetFile = null;
		//判断 en2cn的值
		if(en2cn){
			//说明需要把数据持久化到 en2cn的文件中
			targetFile = new File(EN_TO_CN_FILE);
		}else{
			//说明需要把数据持久化到 cn2en的文件中
			targetFile = new File(CN_TO_EN_FILE);
		}
		//最后，调用dao的方法即可
		baseTermDao.writeToFile(map, targetFile.getAbsolutePath());
	}

}
